iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0

哇~終於來到最後一天了,其實在這幾個禮拜裡面,我禮拜六的文章都是禮拜五晚上熬夜寫出來的,因為我六日白天都常常有事情,所以我都必須半夜就先搞定,不過在這30天自己也複習了很多,現在回想起來覺得這一切都很值得呀~

我相信有許多讀者可能在看前面演算法的時候覺得其實都不難自己都看得懂呀,但是到解題的時候就會覺得,怎麼都想不到原來可以用這種方式來處理,這邊我想跟大家說的是,其實作題目是一種「習慣」,不只是習慣你寫Code的方式,更是習慣如何知道這個問題大概可以用甚麼方法來解決的一種習慣。

其實最後解題的時候,我並沒有把程式碼一行一行的講解說我為什麼要那樣寫,而是在High Level的角度去跟大家分享我看到這個題目的時候我的思考脈絡是怎麼樣,原因有兩個,一是其實一個題目難做就是因為我們不知道他到底是要用哪種資料結構跟演算法,其實只要知道了,就大概都會有一個解題的架構,二來因為有很多的小技巧,譬如index會超出阿,或是遞迴的一些特殊的Base Case等等,如果有自己去碰過壁,那種記憶是會非常非常深的,這也會讓我們之後的Code越寫越好。

這30天我們從了解甚麼是資料結構和演算法,到了解時間複雜度,接著我們看了很多常用的資料結構,分別理解了它的用途以及操作上的時間複雜度,接著再進到演算法,最後解題,如果有哪邊講得不好,或是有錯的也歡迎讀者們來指正小弟我呦!

小總結

到今天我們可以回想資料結構就是「存放資料的方式」,不同資料結構有他的特性,可以依照我們的需求來選擇我們要使用的資料結構。

演算法則是「處理資料的方法」,這會取決於我們使用的資料結構來決定我們所選擇的演算法。

時間複雜度我們所討論的就是,「最差」的狀況下,在input慢慢上升到很大時,我們的程式「要做的步驟」會有甚麼樣的「成長曲線」。

空間複雜度的部分跟時間複雜度一樣,只是差在我們的程式要用的空間會有甚麼樣的「成長曲線」。

最後解題的部分,我在每個類型的文章內有提到大概的解題想法跟架構,只要常常做就會慢慢越來越有感覺囉!

當然演算法的世界還很大,有很多我們沒有講到的演算法,我覺得有些很有趣的我也可以在這邊跟大家稍微列舉一下,如果有興趣可以自己去學習一下。

  • Union Find
  • Topological Sort
  • Dijkstra Algorithm
  • Sliding Windows
  • Prefix Sum
  • Bucket Sort
  • 0/1 knapsack problem
  • 2D-Dynamic Programming
  • Monotonic Stack/Queue

最後謝謝一值陪伴我的讀著們,之後有機會也會再挑戰自己的!


上一篇
解題-Dynamic Programming
系列文
從演算法到解題思路,以Python為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言